<?php
namespace Base\Service;

use Zend\Stdlib\Hydrator\ClassMethods;
use Doctrine\ORM\EntityManager;

/**
 * AbstractService
 * Responsável por disponilizar os métodos de serviço CRUD
 * para persistir entidades no banco de dados 
 * @package Base\Service
 * @author DiegoWagner
 *
 */
abstract class AbstractService {
	
	/**
	 * @var Doctrine\ORM\EntityManager
	 */
	protected $em;
	
	/**
	 * @var Base\Entity\AbstractEntity
	 */
	protected $entity;
		
	
	/**
	 * Dependency Injection
	 * @param EntityManager $em
	 */
	public function __construct( EntityManager $em ) {
		$this->em = $em;
	}
	
	
	/**
	 * @method save()
	 * Método da classe abstrata para inserido ou alteração de entidades
	 * @param array $data
	 * @return AbstractEntity $entity
	 * @throws Exception
	 */
	public function save( array $data ) {
	   	        
    		if ( $data['id'] ) {
    			
    			$entity = $this->em->getReference( $this->entity, $data['id'] );
    			//(new Hydrator\ClassMethods())->hydrate( $data, $entity ); PHP 5.4 somente
    			$hydrator = new ClassMethods();
    			$hydrator->hydrate( $data, $entity );
    			
    		} else {
    
    			$entity = new $this->entity( $data );
    		}
    		
    		$this->em->persist( $entity );
    		$this->em->flush();
    		
    		return $entity;
	}
		
	
	
	
	/**
	 * @method delete()
	 * Método da classe abstrata para excluir entidades
	 * @param int $id
	 * @return int $id
	 * @throws Exception
	 */
	public function remove( $id ) {
	
	    try {
	        
    		$entity = $this->em->find( $this->entity, $id );
    		
    		if( isset ( $entity ) ) {
    		    
    			$this->em->remove( $entity );
    			$this->em->flush();
    					
    			return $id;
    		}
    		
	    } catch( \Exception $e ) {
	        
	        throw new \Exception("Não foi possível remover o registro");
	    }
	}
	
}

?>